package main

import (
	"fmt"
	"runtime"
	"time"
)

/*
*
Golang 默认所有任务都运行在一个 cpu 核里，如果要在 goroutine 中使用多核，可以使用 runtime.GOMAXPROCS 函数修改，当参数小于 1 时使用默认值。

Go运行时的调度器使用 GOMAXPROCS 参数来指定需要使用多少个 OS 线程来同时执行 Go 代码。默认值是机器上的 CPU 核心数
例如在一个 8 核心的机器上，调度器会把 Go 代码同时调度到 8 个 OS 线程上（ GOMAXPROCS 是m:n调度中的n）。

Go语言中可以通过 runtime.GOMAXPROCS() 函数设置当前程序并发时占用的 CPU 逻辑核心数。

Go1.5版本之前，默认使用的是单核心执行。Go1.5版本之后，默认使用全部的 CPU 逻辑核心数。

我们可以通过将任务分配到不同的 CPU 逻辑核心上实现并行的效果，这里举个例子：
*/

func a() {
	for i := 1; i < 10; i++ {
		fmt.Println("A:", i)
	}
}

func b() {
	for i := 1; i < 10; i++ {
		fmt.Println("B:", i)
	}
}

func main() {
	runtime.GOMAXPROCS(8)
	go a()
	go b()
	time.Sleep(time.Second) //睡一会儿，不让主协程结束
}

/**
如果将上面的核心线程数设置为1的话，上面两个任务只有一个逻辑核心，因此此时是做完一个任务然后再去做另外一个任务
如果将核心线程数设置为2以上，打印出来的数据就不一定是按照顺序了。

Go语言中的操作系统线程和 goroutine 的关系：
	一个操作系统线程对应用户态多个 goroutine。
	go 程序可以同时使用多个操作系统线程。
	goroutine 和 OS 线程是多对多的关系，即 m:n。
*/
